11章 例外とエラー処理
https://gyazo.com/51ba590422cb6160a4960060509a9941
例外処理(exception handling): エラーが起きたときに適切な処理を行う機構
なぜエラー処理と呼ばないのか?
想定しているエラーではなく想定していない例外的なケースのための処理
想定しているエラーと想定されていないエラーの境界は曖昧
11.1 Errorオブジェクト
JavaScriptには組み込みのErrorオブジェクトがある
Errorのインスタンス生成時にエラーメッセージを指定することができる
code:js
const err = new Error('メールアドレスの形式が正しくありません');
Errorのインスタンスを生成するだけでは何も起こらない
正しくない場合にErrorのインスタンスを返す
11.2 例外処理
例外処理にはtry...catch文を使う
何かをtryして例外を引き起こした時にcatchによってその例外がキャッチ(捕捉)される
エラーをキャッチしているのでプログラムは停止せずにエラーを記録して実行を続ける
エラーが起こると制御はcatchブロックに移る
11.3 例外のスロー
例外を明示的にスロー(throw)することもできる
JavaScriptでは任意の値をスローすることができるが、Errorオブジェクトのインスタンスをスローするのが一般的
catchブロックではErrorのインスタンスがスローされることを想定しているのが普通
throwを呼び出すと現在実行中の関数は直ちに停止する
11.4 例外処理とコールスタック
コールスタック (Call Stack)は、プログラムで実行中のサブルーチンに関する情報を格納するスタックである。
関数a(メインルーチン) → 関数b(サブルーチン) → 関数c(サブルーチン)
関数cでエラーが起こるとこのエラーは関数bに伝搬し、続いてaに伝搬する
エラーが補足されるまでコールスタックを遡っていく
エラーはコールスタックのどの段階でもキャッチすることもできる。
処理されない例外(unhandled exception)、キャッチされない例外(uncaught exception)
エラーがキャッチされないとJavaScriptの処理系は停止する
エラーがキャッチされた場合はコールスタックがどこで問題が起こったかを示唆する情報を保持している
JavaScriptのほとんどの実装ではErrorのインスタンスにはstackというプロパティがあり、コールスタックの文字列による表現を見ることができる
11.5 try...catch...finally
finallyブロック
エラーの有無にかかわらず最終的に実行されるブロック
11.6 例外処理は例外に限る
例外処理を使って予想可能なエラー処理も行うことはできる
しかし例外は正しく処理されないケースもある
catchブロックに出会うまでスタックをさかのぼって状態を回復させるなどの余計な操作が必要
効率を落とす
想定できるエラーは通常のフロー制御をつかって対処する